package Datos;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.CallableStatement;
import java.util.*;

public class Sucursal {
	Sesion oSesion;
	
	public Sucursal() {};
	
	public int Add(Entidades.Sucursal item) throws Exception{
		try{
		Connection oCnn = Datos.General.CrearConexion();
		String storedProcedure = "{call cpd.SucursalAdd(?,?,?,?)}";
		CallableStatement cs =oCnn.prepareCall(storedProcedure);
		poneDatos(item,cs);
		boolean pipi = cs.execute();
		int numero = 0;
		if (pipi) numero = 1;
		return numero;
		
		} catch (Exception ex){
			   System.out.println("SQLException: " + ex.getMessage());
			   return -1;
		}
	}
	public void Update(Entidades.Sucursal item) throws Exception{
		try{
			Connection oCnn = Datos.General.CrearConexion();
			String storedProcedure = "{call cpd.SucursalUpdate(?,?,?,?)}";
			CallableStatement cs =oCnn.prepareCall(storedProcedure);
			poneDatos(item,cs);
			boolean pipi = cs.execute();
			System.out.println("Resultado booleano: " + pipi);
			return;
		} catch (Exception ex){
			   System.out.println("SQLException: " + ex.getMessage());
		}
	}
	public void Delete(int idSuc, int idBco) throws Exception{
		try{
			Connection oCnn = Datos.General.CrearConexion();
			String storedProcedure = "{call cpd.SucursalDelete(?,?)}";
			CallableStatement cs =oCnn.prepareCall(storedProcedure);
			cs.setInt("mIdSucursal", idSuc);
			cs.setInt("mIdBanco", idBco);
			boolean pipi = cs.execute();
			System.out.println("Resultado booleano: " + pipi);
			return;
		} catch (Exception ex){
			   System.out.println("SQLException: " + ex.getMessage());
		}
	}
	/**
	 * 
	 * @param idSuc
	 * @param idBco
	 * @return
	 * @throws Exception
	 */
	public List GetOne(int idSuc, int idBco) throws Exception{
		ResultSet rs = null;	//
		Connection oCnn = Datos.General.CrearConexion();
		String storedProcedure = "{call cpd.SucursalGetOne(?,?)}";
		CallableStatement cs = oCnn.prepareCall(storedProcedure);
		cs.setInt("mIdSucursal", idSuc);
		cs.setInt("mIdBanco", idBco);
		rs = cs.executeQuery();
		return sacaDatos(rs);
	}

	public List GetAll() throws Exception{
		ResultSet rs = null;	//
		Connection oCnn = Datos.General.CrearConexion();
		String storedProcedure = "{call cpd.SucursalGetAll()}";
		CallableStatement cs = oCnn.prepareCall(storedProcedure);
		rs = cs.executeQuery();
		return sacaDatos(rs);	
	}
	public List Primero() throws Exception{
		return Trae("FIRST");
	}
	public List Siguiente() throws Exception{
		return Trae("NEXT");
	}
	public List Anterior() throws Exception{
		return Trae("PREV");
	}
	public List Ultimo() throws Exception{
		return Trae("LAST");
	}
	public void Abrir() throws Exception{
		oSesion = new Sesion();
		try{
			String sql = "HANDLER `sucursal` OPEN";
			oSesion.getSesion().executeQuery(sql);
		} catch (Exception ex){
			System.out.println("SQLException: " + ex.getMessage());
		}
	}
	public void Cerrar() throws Exception{
		try{
			String sql = "HANDLER `sucursal` CLOSE";
			oSesion.getSesion().executeQuery(sql);
		} catch (Exception ex){
			System.out.println("SQLException: " + ex.getMessage());
		}
	}
	public List Trae(String condicion) throws Exception{
		ResultSet rs = null;	//
		String sql = "HANDLER `sucursal` READ `PRIMARY` " + condicion + "";
		rs = oSesion.getSesion().executeQuery(sql);  //
		return sacaDatos(rs);
	}
	private void poneDatos(Entidades.Sucursal item, CallableStatement cs){
		try{
			cs.setInt("mIdSucursal", item.getIdSucursal());
			cs.setString("mDscSucursal", item.getDscSucursal());
			cs.setString("mIdLocalidad", item.getLocalidad().getIdLocalidad()); 
			cs.setInt("mIdBanco", item.getBanco().getIdBanco());
		} catch (Exception ex){
			   System.out.println("SQLException: " + ex.getMessage());
		}
	}
	private List sacaDatos(ResultSet rs){
		List oDatos = new ArrayList();
		Entidades.Sucursal oDato = null;
		try {
			while(rs.next()){
				List oSubDatos = new ArrayList();
				List oSubDatos2 = new ArrayList();
				try {
					Entidades.Localidad oSubDato2 = null;
					oSubDatos2 = new Datos.Localidad().GetOne(rs.getString(4));
					while(!oSubDatos2.isEmpty()){
						oSubDato2 = (Entidades.Localidad) oSubDatos2.remove(0);
					}
					Entidades.Banco oSubDato = null;
					oSubDatos = new Datos.Banco().GetOne(rs.getInt(2));
					while(!oSubDatos.isEmpty()){
						oSubDato = (Entidades.Banco) oSubDatos.remove(0);
					}
					oDato = new Entidades.Sucursal(
							rs.getInt(1),
							rs.getString(3),
							oSubDato2,
							oSubDato
							);
					oDatos.add(oDato);
					oDato = null;
				} catch (Exception ex){
					System.out.println("SQLException: " + ex.getMessage());
				}
			}
			rs.next();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return oDatos;
	}

}
